什麼是隱喻?
重大发现往往是从类比中产生的。通过把一个你所陌生的事物与你所熟知的事物比较,你
会对它有进一步的认识,从而形成你对它的独到的深刻理解,这种隐喻方法被称之为“模型化”。
在科学发展史上,充满了利用类比而产生的发现。
(模型化,和我理解的抽象化是類似的概念,為了建立對於客觀事物的認知,需要進行抽象化;比如一個系統,通過對方的介紹,能夠立刻了解系統的模塊和優缺點等等,這些部分雖然說明的人可能會說,但是對於了解的人,只有立刻抽象成自己的模型後,才能夠理解,並進行快速的學習和使用,甚至優化擴展等等;比如我們說道一個視頻播放器:會立刻想到一個窗口,然後左下角有一個按鈕,這個按鈕可以‘播放’‘暫停’等,這樣一個模型就可以立刻抽象出來,進行功能設計了);
‘模塊化設計’中的‘信息隱蔽’,是什麼?
(可能是指,提供外的接口,但是內部實現是隱藏的;)
以下是一些适合使用模块的域:
輸入與輸出(函數常常這樣),
用户接口(界面or工具類),
對硬體or操作系統有依賴的部分(會需要處理二進制等,這些都需要隱藏,改動之後會很難發現),
操作系统依赖部分。把对操作系统有依赖的部分放入模块的原因与把对硬件有依赖部分放
入模块的原因是相同的。如果你正在编写一个在 Microsoft Windows 下运行的软件,为什么要把
它局限于 Windows 环境下呢?你完全可以把对 Windows 的调用放在一个 Windows 接口模块中。
如果以后想把程序移植到 Macintosh 或者 OS/2 环境下,你所要做的只是改动一下接口模块而已。
(不同平台的軟體的話,就需要設計一個接口類,與系統相關的部分,都需要通過這個接口類,進行轉化:比如變量int的長度,比如使用一些api的時候,名稱不一樣,還有頭文件不一樣等等;函數名不一樣的話,就都需要轉成自己的函數名;相當於一個adapter;這個在開發pc軟體的時候才需要注意,如果只是開發前端的話,並不會有差別;)
数据管理。应把数据管理部分放入模块中,让其中的子程序去与那些杂乱的实现细节打交道。而让模块外的子程序用抽象的方式与数据打交道,这种方式应该尽可能避免实际处理问题,如果你认为将数据管理模块化是将其放入一个单独模块中,那你就错了。通常,每一种主要的抽象数据类型,都需要一个单独的模块来管理。
(處理不同模塊之間,進行溝通的信號的時候,需要單獨管理,但是這裡所指的自定義的數據,需要每個進行單獨管理,確實是一個更有深度的想法;)
可再使用的代码;(函數和工具類都是)
可能发生变动的相互联系的操作。应该在那些可能发生变动的操作周围修建一道隔墙。这事实上是容错原则的一种,因为这样可以避免局部的变动影响到程序的其余部分。(思考怎麼做這個?這裡的變動的含義是哪一個?一個含義是因為user的使用而會發生變動,另一個含義是因為需求的變動而發生變動;前者的話,是需要提前設計好可能的操作的情況,並進行封裝和處理的;如果是後者的話,就是設計到軟件的可擴展性了,所以是更深層次的部分,這個要設計就需要對於業務有很多的了解才可以;)
互相联系的操作。最后,应把互相联系的操作放到一起。在绝大多数情况下,都可以发现把看起来互相联系的子程序和数据放在一起的更强的组织原则。在无法隐蔽信息的情况下,比如共享数据或计划增强灵活性时,仍然可以把成组操作放在一起,比如,三角函数、统计函数、
字符串操作子程序、图像子程序等。通过精心地成组放置相关操作,还可以在下一个项目中重新使用它。(互相關聯,有共同的抽象的部分的事物放在一起;但是這裡的問題是怎麼設計範圍?設計太小了容易雜亂,設計太大了,又不便於使用,效能也比較差;)
往返设计?
通过组合使用主要设计方法来扬长避短是完全可能的。每种设计方法都只是程序员工具箱中的一件工具,不同的工具适合不同的工作,你将从研究所有方法的启发中获益无穷。(綜合使用不同設計方法進行設計);
你可能会有这样的体验:当你编写程序快结束时,你非常希望能有机会再重新编写一次,因为在编写过程中你对问题又有了更深的理解。(這個就像是復盤一樣,不要因為已經完成了任務就完成了,為了能夠成長,需要進行復盤,如果我當初怎麼做就會更好,這樣下次再進行系統設計的時候,就會update了;)
复杂数据类型
阶梯存取
另一种表存取方法是阶梯法。这种存取方法不如变址法直接,但要比变址法节约空间。阶梯法的主要思想是如图 12-5 所示的阶梯结构,其核心是表中的入口对数据范围而不是对不同数据点有效的。例如你正在编写一个评分程序,"B" 入口的取值范围可以是从 77.5%到 90%。下面是一些你可能遇到的评分范围:
≥90%
A
< 90.0%
B
< 77.5%
C
< 65.0%
D
< 50.0%
F
(這個數據的存儲方法思路很好,但是不知道怎麼使用?)
抽象数据类型
抽象数据类型是由数据及对数据的操作组成的。这些操作既向程序的其余部分描述了数据,也允许程序其余部分改变它所描述的数据。在“抽象数据类型”中的数据指的是广义的数据。抽象数据类型可能是图形窗口及影响该窗口的操作,也可能是一个文件及对文件的操作。(比如一個文件,可以有對這個文件的各種操作;現在設計的像array,map等都是抽象的數據類型;自定義的類也是;)
与顺序无关的程序语句
可能有这种情形,即代码中某些语句或程序块的先后顺序并不重要,一个语句并不依赖于或说逻辑上从属于另一些语句,但实实在在的情况是,次序是影响可读性、性能、维护性的。而且当语句执行顺序的依赖关系不存在时,可用下面的准则来组织这些语句或程序块的顺序。指导原则是“接近原则”,使相关操作组织在一起。使代码能由上读到下,使变量存活时间尽可能短;(比如讀寫的功能就是與順序無關的,但是最好寫在相近的地方,便於查找;)
集成方法
一个好的集成能给你带来以下益处:
· 易于诊断错误
· 更少的错误
· 少量连接框架
· 在短期内形成首次可工作系统
· 短期的全面开发计划
· 良好的用户关系
· 增强信心
· 增加工程完成的机会
· 更可靠的预测计划
· 更准确地了解工程情况
· 提高代码质量
· 减少文件
分段集成
直到前几年,分段集成还是一个规范方法,它按如下设计好的步骤进行。
1. 设计、编程、检查和调试。这个步骤叫“单元开发”。
2. 将各程序合并成一个非常大的系统,这叫“系统集成”。
3. 检查和设计整个系统。这叫做“系统再集成”。
许多良好的编程风格的目的是减少你大脑的负担,以下是一些例子:
“分解”一个系统的目的是为了使其更为简单易懂。人们往往易于理解几条简单的信息而不是一条复杂的信息。所有软件设计方法的目的是将复杂的问题分解为简单的几部分,不论你是否使用结构化、自顶向下或是面向对象的设计,以上目标都相同。进行评审、检查和测试是弥补人的错误的一种方法,评审方法部份源于“无错编程”,如果你没有任何错误,你就用不看评审你的软件,但是当你知道自己的能力是有限时,你就应和别人讨论以提高你的软件质量。将子程序编短一些有助于减少你的工作量。你根据问题而不是计算机科学术语编写程序并使用尽可能高级的抽象思维,有助于减少你的工作量。使用各种交谈方式可将你从编程的死胡同中解放出来。
编程生涯成熟的部分标志是不折不挠地坚持诚实,诚实通常表现在以下几个方面:
不假装你是一个编程能手
乐于承认自己的错误
力图理解编译器警告信息而不是对其置之不理
对你的程序有一个清晰的了解,而不是进行编译看其是否有错
提供实际状态报告
提供实际方案评估,在你的上司面前坚持自己的意见
绝大多数高水平程序员喜欢使自己程序的可读性强,并抽出充足的时间这样作。虽然只有一些人能坚持到底,而且其中一些人还是高水平的代码编写者对开发中程序员级别的了解,有助于解释什么地方适合于此原则:
级别 1:初学者
初学者是能使用一种语言基本能力的程序员,这样的人能够使用子程序、循环、条件语句和其它许多语言特征。
级别 2:中间者
中间级程序员有使用多种语言的能力,并且至少非常熟悉某一种语言。
级别 3:专家
编程专家对其语言或环境或对这二者有着很深的造诣,这种级别的程序员对公司有价值的,而且有些程序员往往就停留在这个水平上。
级别 4:大师
大师有着专家那样的专业知识,并能意识到编程只是 15%和计算机交流,其余 85%是和人打交道。一般程序员只有 30%的时间甚至更少。大师所编写的代码与其说是给计算机看倒不如说是给人看的。真正的大师级程序员所编写的代码是十分清晰易懂的,而且他们注意建立有关文档。他们也不想浪费其精力去重建本来用一句注释就能说清楚的代码段的逻辑结构。
减少复杂性的方法
在软件结构级上,问题的复杂性可以通过将系统分成子系统而得到降低。子程序越独立,复杂性就越得以降低。你应仔细定义模块,这样你才能在某一时间集中于某一件事情,而将代
码组装成目标有许多好处。使用全局数据是有害的,因为它可以削弱某一时刻你集中于某事的能力。使用相同的标记符对模块数据是无害的,因为它不会使你的注意力分开。如果你所设计的子系统间有全局变量共享或粗糙定义的接口,其结果是冲淡了因将系统分成许多子系统所带来的好处。复杂性应可通过好的设计得到最大程度的降低。降低复杂性也是促使代码质量提高的动机;
你之所以编写可读的代码是为了帮助别人阅读你的代码,可读性对程序的以下几个方面有着积极的影响:
· 可理解性
· 可检查性
· 错误率
· 调试
· 可修改性
· 开发时间—一受以上各种因素的影响
· 外部质量——受以上各种因素的影响
總體感想:
1好的代碼是像字典一樣好用的(傻瓜式操作):
提高代碼的可讀性,系統的糾錯方便,可擴展等,這些都是對一個開發者來說是原則性的問題;試想,如果系統有幾萬行代碼,靠自己的眼睛和記憶力是根本找不到bug的;這時候就需要提前設計好,就像是說明書一樣,非常簡介,就像字典一樣,有明確的順序和目錄;這樣才好翻找;
2專家如何成為大師?
專家的大部分時間是用來寫代碼,而大師的大部分時間是用來與人溝通的;也就是說,喜歡溝通,並不斷提升自己的溝通能力,並使用這個能力幫助到團隊,把自己的系統設計的能力,更多的投入在服務團隊上面,而不是寫代碼上面,這樣就能夠往大師發展了;從擅長寫代碼,到擅長協助別人寫代碼;